home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_08
/
9n08012b
< prev
next >
Wrap
Text File
|
1991-07-08
|
2KB
|
57 lines
/* _Dint function -- IEEE 754 version */
#include "xmath.h"
short _Dint(double *px, short xexp)
{ /* test and drop (scaled) fraction bits */
unsigned short *ps = (unsigned short *)px;
unsigned short frac = ps[_D0] & _DFRAC
|| ps[_D1] || ps[_D2] || ps[_D3];
short xchar = (ps[_D0] & _DMASK) >> _DOFF;
if (xchar == 0 && !frac)
return (0); /* zero */
else if (xchar != _DMAX)
; /* finite */
else if (!frac)
return (INF);
else
{ /* NaN */
errno = EDOM;
return (NAN);
}
xchar = (_DBIAS+48+_DOFF+1) - xchar - xexp;
if (xchar < 0)
return (0); /* no frac bits to drop */
else if ((48+_DOFF) xchar)
{ /* all frac bits */
ps[_D0] = 0, ps[_D1] = 0;
ps[_D2] = 0, ps[_D3] = 0;
return (FINITE);
}
else
{ /* strip out frac bits */
static const unsigned short mask[] = {
0x0000, 0x0001, 0x0003, 0x0007,
0x000f, 0x001f, 0x003f, 0x007f,
0x00ff, 0x01ff, 0x03ff, 0x07ff,
0x0fff, 0x1fff, 0x3fff, 0x7fff};
static const size_t sub[] = {_D3, _D2, _D1, _D0};
frac = mask[xchar & 0xf];
xchar >>= 4;
frac &= ps[sub[xchar]];
ps[sub[xchar]] ^= frac;
switch (xchar)
{ /* cascade through! */
case 3:
frac |= ps[_D1], ps[_D1] = 0;
case 2:
frac |= ps[_D2], ps[_D2] = 0;
case 1:
frac |= ps[_D3], ps[_D3] = 0;
}
return (frac ? FINITE : 0);
}
}